iT邦幫忙

2024 iThome 鐵人賽

DAY 7
0
佛心分享-刷題不只是刷題

Ruby刷題:沒那麼痛苦的痛苦面具系列 第 15

DAY 15:Lowest Common Ancestor of a Binary Tree 練練二元樹!

  • 分享至 

  • xImage
  •  

(●˙꒳˙●)
嗨,我是wec,今天是DAY 15。

🔎 題目難度與描述

難度:MEDIUM

題目描述:

給定一棵二叉樹,找出兩個節點pq的最近公共祖先節點(Lowest Common Ancestor)。
1.所有節點的值都是唯一的。
2.pq為不同節點且均存在於給定的二元樹中。

🔎 解題思路&程式碼

1️⃣ 遞迴

第1步: 如果當前節點是nil,返回nil。如果當前節點是pq,則返回當前節點。
第2步: 分別對左右子樹進行遞迴。
第3步: 根據左右子樹的返回結果來判斷:
1.如果左子樹返回nil,則最近的公共祖先在右子樹。
2.如果右子樹返回nil,則最近的公共祖先在左子樹。
3.如果左右子樹都不為nil,則當前節點就是最近的公共祖先。
程式碼:

def lowest_common_ancestor(root, p, q)
  return nil if root.nil?
  return root if root == p || root == q

  left = lowest_common_ancestor(root.left, p, q)
  right = lowest_common_ancestor(root.right, p, q)

  return root if left && right
  left || right
end

🔎 總結

時間複雜度

遞迴法: 時間複雜度為O(n),n為節點數量。
➡️ 公共祖先的概念可以應用在很多地方,例如文件系統之類(要查共同父層的時候),理解樹的結構及遞迴遍歷的特性是解決問題的關鍵,這樣就不用一直去紀錄每個節點的父節點,提高效率!ヽ(・∀・)ノ

那麽,以上就是今天的內容!

相信IT人動腦時都要吃點東西,所以今天邊寫邊吃起司夾心餅。
明天要說:Ruby精選刷題!Medium路跑D-8(>∀・)⌒☆


上一篇
DAY 14:Minimum Depth of Binary Tree 練練二元樹!
下一篇
DAY 16:3 Sum 拼拼湊湊雜湊表!
系列文
Ruby刷題:沒那麼痛苦的痛苦面具30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言